/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CONTABILIDAD_CONTROLADOR;

import CONTABILIDAD_MODELO.CON_COMPROBANTE;
import CONTABILIDAD_MODELO.CON_CUENTA_COMPROBANTE;
import CONTABILIDAD_MODELO.CON_CUENTA_CONTABLE;
import CONTABILIDAD_MODELO.CON_FECHA_CIERRE;
import Conexion.Conexion;
import Modelo.SIS_VERSION;
import RRHH_Modelo.RHH_USUARIO;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author equipo_4
 */
@WebServlet(name = "CON_APERTURA_ANO_FISCAL_CONTROLLER", urlPatterns = {"/CON_APERTURA_ANO_FISCAL_CONTROLLER"})
public class CON_APERTURA_ANO_FISCAL_CONTROLLER extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
           
        } finally {            
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            String proceso=request.getParameter("proceso");
            RHH_USUARIO usuario = ((RHH_USUARIO)request.getSession().getAttribute("usr"));
            Conexion con = new Conexion(usuario.getUSUARIO(), usuario.getPASSWORD());
            String html="";
            switch(proceso){
                case "generar":
                    html=GenerarRecurrente(response,request,con);
                    break;
                case "version":
                    html=version(request, con);
                    break; 
                case "cargarCuenta":
                    html=cargarCuenta(request, con);
                    break;
            }
            
            con.Close();
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(html);
            
        } catch (SQLException ex) {
            
            Logger.getLogger(CON_APERTURA_ANO_FISCAL_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(CON_APERTURA_ANO_FISCAL_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
public String cuentas(HttpServletRequest request, Conexion con ) throws SQLException{
        int vCuenta=Integer.parseInt(request.getParameter("cuenta"));
        CON_CUENTA_CONTABLE cuenta=new CON_CUENTA_CONTABLE(con);
        if(vCuenta ==-1){
           String json=cuenta.generarListaHojasdescripcion();
           return json;
        }
        SIS_VERSION version=new SIS_VERSION(con);
        List<SIS_VERSION> VersionCuenta=version.getUltimaVersion("cuentaHoja");
        
        String cuentaStr="{";
        for (int i = vCuenta; i < VersionCuenta.size(); i++) {
            double ida=VersionCuenta.get(i).getID_CUENTA();
            cuenta=cuenta.BuscarXid(ida);
            if(cuenta==null && !VersionCuenta.get(i).getACCION().equals("E"))continue;
            int idcu=VersionCuenta.get(i).getID_CUENTA().intValue();
            if(VersionCuenta.get(i).getACCION().equals("E") || cuenta==null){
                cuentaStr+="\"c"+idcu+"\":{\"CODIGO\":\"na\", \"NIVEL\":\"na\", \"id\":\""+idcu+"\", \"DESCRIPCION\":\"na\", \"MONEDA\":\"na\"},";
                cuenta=new CON_CUENTA_CONTABLE(con);
                continue;
            }
            cuentaStr+="\"c"+cuenta.getID()+"\":{\"CODIGO\":\""+cuenta.getCODIGO()+"\", \"NIVEL\":\""+cuenta.getID_NIVEL()+"\", \"id\":\""+cuenta.getID()+"\", \"DESCRIPCION\":\""+cuenta.getDESCRIPCION()+"\", \"MONEDA\":\""+cuenta.getID_MONEDA()+"\"},";
        }
        if(cuentaStr.length()==1) return "[]";
        cuentaStr=cuentaStr.substring(0,cuentaStr.length()-1)+"}";
        
        return cuentaStr;
    }
    public String cargarCuenta(HttpServletRequest request, Conexion con ){
        try {
            String cuenta=cuentas(request, con);
            return "{\"cuenta\":"+cuenta+"}";
        } catch (SQLException ex) {
            return "[]";
        }
    }
    public String version(HttpServletRequest request, Conexion con ){
        try {
            SIS_VERSION version=new SIS_VERSION(con);
            String cuenta=version.getVersion("cuenta");
            return "{\"cuenta\":\""+cuenta+"\"}";
        } catch (SQLException ex) {
            return "{\"cuenta\":0,\"centro\":0}";
        }
    }
    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private String GenerarRecurrente(HttpServletResponse response,HttpServletRequest request, Conexion con) throws SQLException, Exception {
        int ano=Integer.parseInt(request.getParameter("ano"));
        int mes=Integer.parseInt(request.getParameter("mes"));
        
        List<String>  filas = new ArrayList<>();
        filas.add("HABER TC");
        filas.add("DEBE TC");
        filas.add("CHEQUE");
        filas.add("HABER");
        filas.add("DEBE");
        filas.add("DESCRIPCION");
        filas.add("ID CUENTA");
        filas.add("ID COMPROBANTE");
        filas.add("ID CENTRO");
        filas.add("DESCRIPCION");
        List<List>  columnas = new ArrayList<>();
        columnas.add(filas);
        
        String consulta ="SELECT CON_CUENTA_CONTABLE.codigo, \n" +
                            "CON_CUENTA_CONTABLE.ID AS ID_CUENTA,\n" +
                            "       CON_CUENTA_CONTABLE.DESCRIPCION AS DESCRIPCION_CUENTA,\n" +
                            "       CON_CENTRO_COSTO.ID AS ID_CENTRO_COSTO,\n" +
                            "       CON_CENTRO_COSTO.DESCRIPCION AS DESCRIPCION_CENTRO_COSTO,\n" +
                            "       SUM (CON_CIERRE.DEBE) AS DEBE, \n" +
                            "       SUM (CON_CIERRE.HABER) AS HABER, \n" +
                            "       SUM (CON_CIERRE.DEBE_TC) AS DEBE_TC,\n" +
                            "       SUM (CON_CIERRE.HABER_TC) AS HABER_TC\n" +
                            "  FROM BROKER.CON_CIERRE,\n" +
                            "       BROKER.CON_CUENTA_CONTABLE,\n" +
                            "       BROKER.CON_FECHA_CIERRE,\n" +
                            "       BROKER.CON_CENTRO_COSTO\n" +
                            " WHERE     (CON_CIERRE.ID_CUENTA_CONTABLE = CON_CUENTA_CONTABLE.ID)\n" +
                            "       AND (CON_CIERRE.ID_FECHA_CIERRE = CON_FECHA_CIERRE.ID)\n" +
                            "       AND (CON_FECHA_CIERRE.ANO = "+ano+")\n" +
                            "       AND (CON_CIERRE.ID_CENTRO_COSTO = CON_CENTRO_COSTO.ID(+))\n" +
                            "       AND (CON_CUENTA_CONTABLE.CODIGO) NOT IN (SELECT CODIGO FROM BROKER.CON_CUENTA_CONTABLE \n" +
                            "                                                                                WHERE  ((CON_CUENTA_CONTABLE.CODIGO LIKE '4%')  \n" +
                            "      OR  (CON_CUENTA_CONTABLE.CODIGO LIKE '5%')))\n" +
                            "GROUP BY \n" +
                            "      CON_CUENTA_CONTABLE.ID,\n" +
                            "       CON_CUENTA_CONTABLE.DESCRIPCION,\n" +
                            "       CON_CENTRO_COSTO.ID,\n" +
                            "       CON_CENTRO_COSTO.DESCRIPCION,\n" +
                            "CON_CUENTA_CONTABLE.codigo\n" +
                            "ORDER BY CON_CUENTA_CONTABLE.CODIGO";
        ResultSet rs = con.EjecutarConsulta(consulta);
        
        CON_COMPROBANTE comp = new CON_COMPROBANTE();
        comp.setCon(con);
        comp = comp.BuscarXRECURRENTE(5);
        
        
        
        String glosa = request.getParameter("glosa");
        String codigo = request.getParameter("codigo");
        String glosa_cuenta = request.getParameter("glosa_cuenta");
        String util_bs = request.getParameter("util_bs");
        String util_tc = request.getParameter("util_tc");
        
        comp.setGLOSA(glosa);
        String meses=mes+"";
        if(mes<10)
        {
            meses = "0"+mes;
        }
        
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        
        CON_FECHA_CIERRE fecha = new CON_FECHA_CIERRE();
        fecha.setCon(con); 

        mes=fecha.mesActual();
        ano=fecha.anoActual();
            
        Date dt =Calendar.getInstance().getTime();
        
        
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.MONTH, mes-1);
            cal.set(Calendar.YEAR, ano);
            cal.set(Calendar.DAY_OF_MONTH, 1);// This is necessary to get proper results
            cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
            dt =cal.getTime();
          
        
        comp.setFECHA(dt);
        comp.Update();
        
        CON_CUENTA_COMPROBANTE cuenta = new CON_CUENTA_COMPROBANTE();
        cuenta.setCon(con);
        cuenta.EliminarXComprobante(comp.getID());
        
        CON_CUENTA_CONTABLE cuentac = new CON_CUENTA_CONTABLE(con);
        cuentac.setCon(con);
        cuentac = cuentac.BuscarXCodigo(codigo);
        
        Double total = Double.parseDouble(util_bs);
        Double total_tc = Double.parseDouble(util_tc);
                                
        con.Transacction();
        while(rs.next())
        {
            double id_cuenta =rs.getDouble("ID_CUENTA");
            double id_centro =rs.getDouble("ID_CENTRO_COSTO");
            double debe =rs.getDouble("DEBE");
            double debe_tc =rs.getDouble("DEBE_TC");
            double haber =rs.getDouble("HABER");
            double haber_tc =rs.getDouble("HABER_TC");
            String desc_cuenta=rs.getString("DESCRIPCION_CUENTA");
            String desc_centro=rs.getString("DESCRIPCION_CENTRO_COSTO");
                
            String desc="";
            if(id_centro==0.0)
                desc=desc_cuenta;
            else
                desc = desc_centro;
                
            double neteado_tc = haber_tc-debe_tc;
            double neteado = haber-debe;
            String ad;
            if(neteado_tc==0.0)
                ad ="";
            
            if(neteado>0)
            {
                filas = new ArrayList<>();
                filas.add(neteado_tc+"");
                filas.add(0.0+"");
                filas.add(0.0+"");
                filas.add(neteado+"");
                filas.add(0.0+"");
                filas.add("ASIENTO DE APERTURA");
                filas.add(id_cuenta+"");
                filas.add(comp.getID()+"");                
                filas.add(id_centro+"");
                filas.add(desc);
                columnas.add(filas);
                cuenta = new CON_CUENTA_COMPROBANTE(neteado_tc, 0.0, 0.0, neteado, 0.0, "ASIENTO DE APERTURA", id_cuenta, comp.getID(), id_centro, desc, 0.0);
                cuenta.setCon(con);
                cuenta.Insertar();
            }
            if(neteado<0)
            {
                filas = new ArrayList<>();
                filas.add(0.0+"");
                filas.add(neteado_tc*-1+"");
                filas.add(0.0+"");
                filas.add(0.0+"");
                filas.add(neteado*-1+"");
                filas.add("ASIENTO DE APERTURA");
                filas.add(id_cuenta+"");
                filas.add(comp.getID()+"");                
                filas.add(id_centro+"");
                filas.add(desc);
                columnas.add(filas);
                cuenta = new CON_CUENTA_COMPROBANTE(0.0, neteado_tc*-1, 0.0, 0.0, neteado*-1, "ASIENTO DE APERTURA", id_cuenta, comp.getID(), id_centro, desc, 0.0);
                cuenta.setCon(con);
            cuenta.Insertar();
            }
            
        }
        if(total>0)
        {
            filas = new ArrayList<>();
                filas.add(0.0+"");
                filas.add(total+"");
                filas.add(0.0+"");
                filas.add(0.0+"");
                filas.add(total_tc+"");
                filas.add("ASIENTO DE APERTURA");
                filas.add(glosa_cuenta+"");
                filas.add(comp.getID()+"");                
                filas.add(0.0+"");
                filas.add("");
                columnas.add(filas);
            cuenta = new CON_CUENTA_COMPROBANTE(total, 0.0, 0.0, total_tc, 0.0, glosa_cuenta, cuentac.getID(), comp.getID(), 0.0, "", 0.0);
            cuenta.setCon(con);
            cuenta.Insertar();
        }
        if(total<0)
        {
             filas = new ArrayList<>();
                filas.add(0.0+"");
                filas.add(total*-1+"");
                filas.add(0.0+"");
                filas.add(0.0+"");
                filas.add(total_tc*-1+"");
                filas.add("ASIENTO DE APERTURA");
                filas.add(glosa_cuenta+"");
                filas.add(comp.getID()+"");                
                filas.add(0.0+"");
                filas.add("");
                columnas.add(filas);
            cuenta = new CON_CUENTA_COMPROBANTE(0.0, total*-1, 0.0, 0.0, total_tc*-1, glosa_cuenta, cuentac.getID(), comp.getID(), 0.0, "", 0.0);
            cuenta.setCon(con);
            cuenta.Insertar();
        }
        con.commit();
        
       /* String[][] mat = new String[columnas.size()][10];
        
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[i].length; j++) {
                mat[i][j] = columnas.get(i).get(j)+"";
            }            
        }
        excel.excel(mat);*/
        return comp.getID()+"";
    }
}
